package br.com.freelancer.bo;

import java.util.Date;
import java.util.List;

import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.freelancer.dao.IUsuarioDAO;
import br.com.freelancer.modelo.Usuario;

@Service
@Transactional
public class UsuarioBO {

	@Autowired
	private IUsuarioDAO usuarioDAO;
	
	public Long incluir(Usuario usuario){
		usuario.setDataCriacao(new Date());
		return usuarioDAO.save(usuario);
	}
	
	public void excluir(Usuario usuario){
		this.inativar(usuario.getId());
	}
	public void excluir(Long id){
		this.inativar(id);
	}
	public void inativar(Long id){
		Usuario usuario = usuarioDAO.findById(id);
		if (usuario == null) {
			throw new IllegalArgumentException("Usuário inválido.");
		}
		usuario.setAtivo(false);
		usuario.setDataModificacao(new Date());
		usuarioDAO.update(usuario);
	}
	
	public Usuario alterar(Usuario usuario){
		usuario.setDataModificacao(new Date());
		return usuarioDAO.update(usuario);
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> listarTodos(){
		return (List<Usuario>) usuarioDAO.findAll();
	}
	
	public Usuario obterPorId(Long id, boolean lock){
		return usuarioDAO.findById(id, lock);
	}
	public Usuario obterPorId(Long id){
		return usuarioDAO.findById(id);
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> listarAtivos(){
		return (List<Usuario>) usuarioDAO.findByCriteria(Restrictions.eq("ativo", true));
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> listarPorApelido(String apelido){
		return (List<Usuario>) usuarioDAO.findByCriteria(Restrictions.like("apelido", apelido, MatchMode.ANYWHERE));
	}
	
	public Usuario efetuaLogin(String login, String senha){
		Usuario usuario = (Usuario) usuarioDAO.findByCriteria(Restrictions.eq("login", login), Restrictions.eq("senha", senha)).get(0);
		if (usuario == null) {
			throw new IllegalArgumentException("Login/Senha inválido(s).");
		}
		usuario.setDataUltimoLogin(new Date());
		usuario.setContadorLogin(usuario.getContadorLogin()+1);
		return this.alterar(usuario);
	}
}
